using System;
using System.Collections;
using UnityEngine;

/*
* Introduction：    MonoBase 是所有MonoBehaviour脚本的基类，提供了一些常用的功能显示和隐藏游戏对象、延迟执行动作等
* Version：         1.0
* Creator：         yixiang.hui
* Creation Time：   2025.9.1
*
* Last Editor：     yixiang.hui 
* Last Edit Time：  2025.9.1
* Note：            1.0版本完成基本功能
*/

namespace HyxFrame.Core
{
    /// <summary>
    /// MonoBase 是所有MonoBehaviour脚本的基类，提供了一些常用的功能和工具方法
    /// </summary>
    public  partial class MonoBase : MonoBehaviour
    {
        /// <summary>
        /// 激活游戏对象
        /// </summary>
        public void Activate()
        {
            this.gameObject.SetActive(true);
        }
        /// <summary>
        /// 禁用游戏对象
        /// </summary>
        public void Deactivate()
        {
            this.gameObject.SetActive(false);
        }


        /// <summary>
        /// 延迟指定时间后执行某个动作
        ///
        /// 返回一个协程对象，以便在需要时可以停止它
        /// </summary>
        /// <param name="delay">延迟时间（秒）</param>
        /// <param name="action">要执行的动作</param>
        /// <param name="timeIndependent">是否使用独立于时间缩放的时间（默认为true）</param>
        /// <returns>协程对象</returns>
        public Coroutine DelayAction(float delay, Action action, bool timeIndependent = true)
        {
            return StartCoroutine(DelayCoroutine(delay, action, timeIndependent));
        }

        /// <summary>
        /// 延迟执行协程的内部实现
        /// </summary>
        /// <param name="delay">延迟时间（秒）</param>
        /// <param name="action">要执行的动作</param>
        /// <param name="timeIndependent">是否使用独立于时间缩放的时间</param>
        /// <returns>协程枚举器</returns>
        private IEnumerator DelayCoroutine(float delay, Action action, bool timeIndependent = true)
        {
            float time = delay;
            while (time >= 0)
            {
                // 根据timeIndependent参数决定使用不受时间缩放影响的deltaTime还是常规的deltaTime
                time -= timeIndependent ? Time.unscaledDeltaTime : Time.deltaTime;
                yield return null;
            }

            // 延迟时间结束后执行指定的动作
            action.Invoke();
        }
    }
}